<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
<meta name="viewport" content="width=device-width">
<meta name="theme-color" content="#222">
<meta name="generator" content="Hexo 5.4.0">


  <link rel="icon" type="image/png" sizes="16x16" href="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/avatar.jpg">

<link rel="stylesheet" href="/next/css/main.css">



<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@5.15.3/css/all.min.css" integrity="sha256-2H3fkXt6FEmrReK448mDVGKb3WW2ZZw35gI7vqHOE4Y=" crossorigin="anonymous">
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/animate.css@3.1.1/animate.min.css" integrity="sha256-PR7ttpcvz8qrF57fur/yAx1qXMFJeJFiA6pSzWi0OIE=" crossorigin="anonymous">
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fancyapps/fancybox@3.5.7/dist/jquery.fancybox.min.css" integrity="sha256-Vzbj7sDDS/woiFS3uNKo8eIuni59rjyNGtXfstRzStA=" crossorigin="anonymous">

<script class="next-config" data-name="main" type="application/json">{"hostname":"cnhuazhu.gitee.io","root":"/next/","images":"/next/images","scheme":"Mist","version":"8.6.1","exturl":false,"sidebar":{"position":"left","Muse | Mist":320,"display":"post","padding":18,"offset":12},"copycode":true,"bookmark":{"enable":false,"color":"#222","save":"auto"},"fancybox":true,"mediumzoom":true,"lazyload":false,"pangu":false,"comments":{"style":"tabs","active":null,"storage":true,"lazyload":false,"nav":null},"motion":{"enable":true,"async":false,"transition":{"post_block":"fadeIn","post_header":"fadeInDown","post_body":"fadeInDown","coll_header":"fadeInLeft","sidebar":"fadeInUp"}},"prism":false,"i18n":{"placeholder":"搜索...","empty":"没有找到任何搜索结果：${query}","hits_time":"找到 ${hits} 个搜索结果（用时 ${time} 毫秒）","hits":"找到 ${hits} 个搜索结果"},"path":"/next/search.xml","localsearch":{"enable":true,"trigger":"auto","top_n_per_article":1,"unescape":false,"preload":false}}</script><script src="/next/js/config.js"></script>
<meta name="description" content="记录操作系统学习历程">
<meta property="og:type" content="article">
<meta property="og:title" content="操作系统学习笔记-I&#x2F;O管理和磁盘调度">
<meta property="og:url" content="https://cnhuazhu.gitee.io/next/2021/06/02/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0-I-O%E7%AE%A1%E7%90%86%E5%92%8C%E7%A3%81%E7%9B%98%E8%B0%83%E5%BA%A6/index.html">
<meta property="og:site_name" content="花猪のBlog">
<meta property="og:description" content="记录操作系统学习历程">
<meta property="og:locale" content="zh_CN">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/OS%E4%B8%8D%E5%90%8CIO%E8%AE%BE%E5%A4%87%E7%9A%84%E9%80%9F%E7%8E%87.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/OSDMA%E6%A1%86%E5%9B%BE.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/OSDMA%E6%9C%BA%E5%88%B6%E4%B8%80.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/OSDMA%E6%9C%BA%E5%88%B6%E4%BA%8C.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/OSDMA%E6%9C%BA%E5%88%B6%E4%B8%89.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/OSIO层次结构.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/OS%E5%8D%95%E7%BC%93%E5%86%B2.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/OS%E5%8F%8C%E7%BC%93%E5%86%B2.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/OS%E5%BE%AA%E7%8E%AF%E7%BC%93%E5%86%B2.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/OS磁盘模型1.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/OS%E7%A3%81%E7%9B%98%E7%9A%84%E6%80%A7%E8%83%BD.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/OS%E7%A3%81%E7%9B%98%E8%B0%83%E5%BA%A6%E5%85%88%E8%BF%9B%E5%85%88%E5%87%BA.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/OS%E7%A3%81%E7%9B%98%E8%B0%83%E5%BA%A6%E6%9C%80%E7%9F%AD%E6%9C%8D%E5%8A%A1%E6%97%B6%E9%97%B4%E4%BC%98%E5%85%88.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/OSSCAN.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/OSCSCAN.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/OS%E7%A3%81%E7%9B%98%E8%B0%83%E5%BA%A6%E6%AF%94%E8%BE%83.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/OSRAID0.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/OSRAID1.png">
<meta property="og:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/OSRAID5.png">
<meta property="article:published_time" content="2021-06-02T12:02:45.000Z">
<meta property="article:modified_time" content="2021-06-24T08:55:34.006Z">
<meta property="article:author" content="花猪">
<meta property="article:tag" content="操作系统">
<meta name="twitter:card" content="summary">
<meta name="twitter:image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/OS%E4%B8%8D%E5%90%8CIO%E8%AE%BE%E5%A4%87%E7%9A%84%E9%80%9F%E7%8E%87.png">


<link rel="canonical" href="https://cnhuazhu.gitee.io/next/2021/06/02/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0-I-O%E7%AE%A1%E7%90%86%E5%92%8C%E7%A3%81%E7%9B%98%E8%B0%83%E5%BA%A6/">



<script class="next-config" data-name="page" type="application/json">{"sidebar":"","isHome":false,"isPost":true,"lang":"zh-CN","comments":true,"permalink":"https://cnhuazhu.gitee.io/next/2021/06/02/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0-I-O%E7%AE%A1%E7%90%86%E5%92%8C%E7%A3%81%E7%9B%98%E8%B0%83%E5%BA%A6/","path":"2021/06/02/操作系统/操作系统学习笔记-I-O管理和磁盘调度/","title":"操作系统学习笔记-I/O管理和磁盘调度"}</script>

<script class="next-config" data-name="calendar" type="application/json">""</script>
<title>操作系统学习笔记-I/O管理和磁盘调度 | 花猪のBlog</title>
  




  <noscript>
    <link rel="stylesheet" href="/next/css/noscript.css">
  </noscript>
</head>

<body itemscope itemtype="http://schema.org/WebPage" class="use-motion">
  <div class="headband"></div>

  <main class="main">
    <header class="header" itemscope itemtype="http://schema.org/WPHeader">
      <div class="header-inner"><div class="site-brand-container">
  <div class="site-nav-toggle">
    <div class="toggle" aria-label="切换导航栏" role="button">
        <span class="toggle-line"></span>
        <span class="toggle-line"></span>
        <span class="toggle-line"></span>
    </div>
  </div>

  <div class="site-meta">

    <a href="/next/" class="brand" rel="start">
      <i class="logo-line"></i>
      <h1 class="site-title">花猪のBlog</h1>
      <i class="logo-line"></i>
    </a>
  </div>

  <div class="site-nav-right">
    <div class="toggle popup-trigger">
        <i class="fa fa-search fa-fw fa-lg"></i>
    </div>
  </div>
</div>



<nav class="site-nav">
  <ul class="main-menu menu">
        <li class="menu-item menu-item-主站"><a href="https://cnhuazhu.top/" rel="noopener" target="_blank"><i class="fas fa-chevron-right fa-fw"></i>主站</a></li>
        <li class="menu-item menu-item-home"><a href="/next/" rel="section"><i class="fa fa-home fa-fw"></i>首页</a></li>
        <li class="menu-item menu-item-tags"><a href="/next/tags/" rel="section"><i class="fa fa-tags fa-fw"></i>标签<span class="badge">14</span></a></li>
        <li class="menu-item menu-item-categories"><a href="/next/categories/" rel="section"><i class="fa fa-th fa-fw"></i>分类<span class="badge">8</span></a></li>
        <li class="menu-item menu-item-archives"><a href="/next/archives/" rel="section"><i class="fa fa-archive fa-fw"></i>归档<span class="badge">53</span></a></li>
      <li class="menu-item menu-item-search">
        <a role="button" class="popup-trigger"><i class="fa fa-search fa-fw"></i>搜索
        </a>
      </li>
  </ul>
</nav>



  <div class="search-pop-overlay">
    <div class="popup search-popup"><div class="search-header">
  <span class="search-icon">
    <i class="fa fa-search"></i>
  </span>
  <div class="search-input-container">
    <input autocomplete="off" autocapitalize="off" maxlength="80"
           placeholder="搜索..." spellcheck="false"
           type="search" class="search-input">
  </div>
  <span class="popup-btn-close" role="button">
    <i class="fa fa-times-circle"></i>
  </span>
</div>
<div class="search-result-container no-result">
  <div class="search-result-icon">
    <i class="fa fa-spinner fa-pulse fa-5x"></i>
  </div>
</div>

    </div>
  </div>

</div>
        
  
  <div class="toggle sidebar-toggle" role="button">
    <span class="toggle-line"></span>
    <span class="toggle-line"></span>
    <span class="toggle-line"></span>
  </div>

  <aside class="sidebar">

    <div class="sidebar-inner sidebar-nav-active sidebar-toc-active">
      <ul class="sidebar-nav">
        <li class="sidebar-nav-toc">
          文章目录
        </li>
        <li class="sidebar-nav-overview">
          站点概览
        </li>
      </ul>

      <div class="sidebar-panel-container">
        <!--noindex-->
        <div class="post-toc-wrap sidebar-panel">
            <div class="post-toc animated"><ol class="nav"><li class="nav-item nav-level-1"><a class="nav-link" href="#%E5%89%8D%E8%A8%80"><span class="nav-number">1.</span> <span class="nav-text">前言</span></a></li><li class="nav-item nav-level-1"><a class="nav-link" href="#%E7%AC%AC%E5%8D%81%E4%B8%80%E7%AB%A0%EF%BC%9AI-O%E7%AE%A1%E7%90%86%E5%92%8C%E7%A3%81%E7%9B%98%E8%B0%83%E5%BA%A6"><span class="nav-number">2.</span> <span class="nav-text">第十一章：I&#x2F;O管理和磁盘调度</span></a><ol class="nav-child"><li class="nav-item nav-level-2"><a class="nav-link" href="#I-O%E8%AE%BE%E5%A4%87"><span class="nav-number">2.1.</span> <span class="nav-text">I&#x2F;O设备</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#I-O%E5%8A%9F%E8%83%BD%E7%9A%84%E7%BB%84%E7%BB%87"><span class="nav-number">2.2.</span> <span class="nav-text">I&#x2F;O功能的组织</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#I-O%E5%8A%9F%E8%83%BD%E7%9A%84%E5%8F%91%E5%B1%95"><span class="nav-number">2.2.1.</span> <span class="nav-text">I&#x2F;O功能的发展</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%9B%B4%E6%8E%A5%E5%AD%98%E5%82%A8%E5%99%A8%E8%AE%BF%E9%97%AE%EF%BC%88DMA%EF%BC%89"><span class="nav-number">2.2.2.</span> <span class="nav-text">直接存储器访问（DMA）</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1%E9%97%AE%E9%A2%98"><span class="nav-number">2.3.</span> <span class="nav-text">操作系统设计问题</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#%E8%AE%BE%E8%AE%A1%E7%9B%AE%E6%A0%87"><span class="nav-number">2.3.1.</span> <span class="nav-text">设计目标</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#I-O%E5%8A%9F%E8%83%BD%E7%9A%84%E9%80%BB%E8%BE%91%E7%BB%93%E6%9E%84"><span class="nav-number">2.3.2.</span> <span class="nav-text">I&#x2F;O功能的逻辑结构</span></a></li><li class="nav-item nav-level-3"><a class="nav-link"><span class="nav-number">2.3.3.</span> <span class="nav-text"></span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#I-O%E7%BC%93%E5%86%B2"><span class="nav-number">2.4.</span> <span class="nav-text">I&#x2F;O缓冲</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#%E5%8D%95%E7%BC%93%E5%86%B2"><span class="nav-number">2.4.1.</span> <span class="nav-text">单缓冲</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E5%8F%8C%E7%BC%93%E5%86%B2"><span class="nav-number">2.4.2.</span> <span class="nav-text">双缓冲</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E5%BE%AA%E7%8E%AF%E7%BC%93%E5%86%B2"><span class="nav-number">2.4.3.</span> <span class="nav-text">循环缓冲</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#%E7%A3%81%E7%9B%98%E8%B0%83%E5%BA%A6"><span class="nav-number">2.5.</span> <span class="nav-text">磁盘调度</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%A3%81%E7%9B%98%E6%80%A7%E8%83%BD"><span class="nav-number">2.5.1.</span> <span class="nav-text">磁盘性能</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#%E7%A3%81%E7%9B%98%E8%B0%83%E5%BA%A6%E7%AD%96%E7%95%A5"><span class="nav-number">2.5.2.</span> <span class="nav-text">磁盘调度策略</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#%E4%BC%98%E5%85%88%E7%BA%A7%EF%BC%88Priority%EF%BC%8CPRI%EF%BC%89"><span class="nav-number">2.5.2.1.</span> <span class="nav-text">优先级（Priority，PRI）</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#%E5%85%88%E8%BF%9B%E5%85%88%E5%87%BA%EF%BC%88First-in-First-out%EF%BC%8CFIFO%EF%BC%89"><span class="nav-number">2.5.2.2.</span> <span class="nav-text">先进先出（First-in First-out，FIFO）</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#%E5%90%8E%E8%BF%9B%E5%85%88%E5%87%BA%EF%BC%88Last-in-First-out%EF%BC%8CLIFO%EF%BC%89"><span class="nav-number">2.5.2.3.</span> <span class="nav-text">后进先出（Last-in First-out，LIFO）</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#%E6%9C%80%E7%9F%AD%E6%9C%8D%E5%8A%A1%E6%97%B6%E9%97%B4%E4%BC%98%E5%85%88%EF%BC%88Shortest-Service-Time-First-%EF%BC%8CSSTF%EF%BC%89"><span class="nav-number">2.5.2.4.</span> <span class="nav-text">最短服务时间优先（Shortest Service Time First ，SSTF）</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#SCAN%EF%BC%88%E6%89%AB%E6%8F%8F%EF%BC%8C%E7%94%B5%E6%A2%AF%E7%AE%97%E6%B3%95%EF%BC%89"><span class="nav-number">2.5.2.5.</span> <span class="nav-text">SCAN（扫描，电梯算法）</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#C-SCAN%EF%BC%88%E5%BE%AA%E7%8E%AF%E6%89%AB%E6%8F%8F%EF%BC%89"><span class="nav-number">2.5.2.6.</span> <span class="nav-text">C-SCAN（循环扫描）</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#N-step-SCAN"><span class="nav-number">2.5.2.7.</span> <span class="nav-text">N-step-SCAN</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#FSCAN"><span class="nav-number">2.5.2.8.</span> <span class="nav-text">FSCAN</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#%E7%A3%81%E7%9B%98%E8%B0%83%E5%BA%A6%E7%AE%97%E6%B3%95%E6%AF%94%E8%BE%83"><span class="nav-number">2.5.2.9.</span> <span class="nav-text">磁盘调度算法比较</span></a></li></ol></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#RAID"><span class="nav-number">2.6.</span> <span class="nav-text">RAID</span></a><ol class="nav-child"><li class="nav-item nav-level-4"><a class="nav-link" href="#RAID0"><span class="nav-number">2.6.0.1.</span> <span class="nav-text">RAID0</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#RAID1"><span class="nav-number">2.6.0.2.</span> <span class="nav-text">RAID1</span></a></li><li class="nav-item nav-level-4"><a class="nav-link" href="#RAID5"><span class="nav-number">2.6.0.3.</span> <span class="nav-text">RAID5</span></a></li></ol></li></ol></li></ol></li><li class="nav-item nav-level-1"><a class="nav-link" href="#%E5%90%8E%E8%AE%B0"><span class="nav-number">3.</span> <span class="nav-text">后记</span></a></li></ol></div>
        </div>
        <!--/noindex-->

        <div class="site-overview-wrap sidebar-panel">
          <div class="site-overview">
            <div class="site-author site-overview-item animated" itemprop="author" itemscope itemtype="http://schema.org/Person">
    <img class="site-author-image" itemprop="image" alt="花猪"
      src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/avatar.jpg">
  <p class="site-author-name" itemprop="name">花猪</p>
  <div class="site-description" itemprop="description">为了获得不同的阅读体验，建立此分站。<br>（可在导航栏搜索想要查看的文章）<br><br>本站主题：NEXT 8.6.1</div>
</div>
<div class="site-state-wrap site-overview-item animated">
  <nav class="site-state">
      <div class="site-state-item site-state-posts">
          <a href="/next/archives/">
        
          <span class="site-state-item-count">53</span>
          <span class="site-state-item-name">日志</span>
        </a>
      </div>
      <div class="site-state-item site-state-categories">
            <a href="/next/categories/">
          
        <span class="site-state-item-count">8</span>
        <span class="site-state-item-name">分类</span></a>
      </div>
      <div class="site-state-item site-state-tags">
            <a href="/next/tags/">
          
        <span class="site-state-item-count">14</span>
        <span class="site-state-item-name">标签</span></a>
      </div>
  </nav>
</div>
  <div class="links-of-author site-overview-item animated">
      <span class="links-of-author-item">
        <a href="https://github.com/CNhuazhu" title="GitHub → https:&#x2F;&#x2F;github.com&#x2F;CNhuazhu" rel="noopener" target="_blank"><i class="fab fa-github fa-fw"></i>GitHub</a>
      </span>
  </div>



          </div>
        </div>
      </div>
    </div>
  </aside>
  <div class="sidebar-dimmer"></div>


    </header>

    
  <div class="back-to-top" role="button" aria-label="返回顶部">
    <i class="fa fa-arrow-up"></i>
    <span>0%</span>
  </div>
  <div class="reading-progress-bar"></div>

  <a href="https://github.com/CNhuazhu" class="github-corner" title="Follow me on GitHub" aria-label="Follow me on GitHub" rel="noopener" target="_blank"><svg width="80" height="80" viewBox="0 0 250 250" aria-hidden="true"><path d="M0,0 L115,115 L130,115 L142,142 L250,250 L250,0 Z"></path><path d="M128.3,109.0 C113.8,99.7 119.0,89.6 119.0,89.6 C122.0,82.7 120.5,78.6 120.5,78.6 C119.2,72.0 123.4,76.3 123.4,76.3 C127.3,80.9 125.5,87.3 125.5,87.3 C122.9,97.6 130.6,101.9 134.4,103.2" fill="currentColor" style="transform-origin: 130px 106px;" class="octo-arm"></path><path d="M115.0,115.0 C114.9,115.1 118.7,116.5 119.8,115.4 L133.7,101.6 C136.9,99.2 139.9,98.4 142.2,98.6 C133.8,88.0 127.5,74.4 143.8,58.0 C148.5,53.4 154.0,51.2 159.7,51.0 C160.3,49.4 163.2,43.6 171.4,40.1 C171.4,40.1 176.1,42.5 178.8,56.2 C183.1,58.6 187.2,61.8 190.9,65.4 C194.5,69.0 197.7,73.2 200.1,77.6 C213.8,80.2 216.3,84.9 216.3,84.9 C212.7,93.1 206.9,96.0 205.4,96.6 C205.1,102.4 203.0,107.8 198.3,112.5 C181.9,128.9 168.3,122.5 157.7,114.1 C157.9,116.9 156.7,120.9 152.7,124.9 L141.0,136.5 C139.8,137.7 141.6,141.9 141.8,141.8 Z" fill="currentColor" class="octo-body"></path></svg></a>

<noscript>
  <div class="noscript-warning">Theme NexT works best with JavaScript enabled</div>
</noscript>


    <div class="main-inner post posts-expand">


  


<div class="post-block">
  
  

  <article itemscope itemtype="http://schema.org/Article" class="post-content" lang="zh-CN">
    <link itemprop="mainEntityOfPage" href="https://cnhuazhu.gitee.io/next/2021/06/02/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0-I-O%E7%AE%A1%E7%90%86%E5%92%8C%E7%A3%81%E7%9B%98%E8%B0%83%E5%BA%A6/">

    <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person">
      <meta itemprop="image" content="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/avatar.jpg">
      <meta itemprop="name" content="花猪">
      <meta itemprop="description" content="为了获得不同的阅读体验，建立此分站。<br>（可在导航栏搜索想要查看的文章）<br><br>本站主题：NEXT 8.6.1">
    </span>

    <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization">
      <meta itemprop="name" content="花猪のBlog">
    </span>
      <header class="post-header">
        <h1 class="post-title" itemprop="name headline">
          操作系统学习笔记-I/O管理和磁盘调度
        </h1>

        <div class="post-meta-container">
          <div class="post-meta">
    <span class="post-meta-item">
      <span class="post-meta-item-icon">
        <i class="far fa-calendar"></i>
      </span>
      <span class="post-meta-item-text">发表于</span>

      <time title="创建时间：2021-06-02 20:02:45" itemprop="dateCreated datePublished" datetime="2021-06-02T20:02:45+08:00">2021-06-02</time>
    </span>
      <span class="post-meta-item">
        <span class="post-meta-item-icon">
          <i class="far fa-calendar-check"></i>
        </span>
        <span class="post-meta-item-text">更新于</span>
        <time title="修改时间：2021-06-24 16:55:34" itemprop="dateModified" datetime="2021-06-24T16:55:34+08:00">2021-06-24</time>
      </span>
    <span class="post-meta-item">
      <span class="post-meta-item-icon">
        <i class="far fa-folder"></i>
      </span>
      <span class="post-meta-item-text">分类于</span>
        <span itemprop="about" itemscope itemtype="http://schema.org/Thing">
          <a href="/next/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/" itemprop="url" rel="index"><span itemprop="name">学习笔记</span></a>
        </span>
    </span>

  
    <span id="/next/2021/06/02/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0-I-O%E7%AE%A1%E7%90%86%E5%92%8C%E7%A3%81%E7%9B%98%E8%B0%83%E5%BA%A6/" class="post-meta-item leancloud_visitors" data-flag-title="操作系统学习笔记-I/O管理和磁盘调度" title="阅读次数">
      <span class="post-meta-item-icon">
        <i class="far fa-eye"></i>
      </span>
      <span class="post-meta-item-text">阅读次数：</span>
      <span class="leancloud-visitors-count"></span>
    </span>
    <span id="/next/2021/06/02/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0-I-O%E7%AE%A1%E7%90%86%E5%92%8C%E7%A3%81%E7%9B%98%E8%B0%83%E5%BA%A6/" class="post-meta-item twikoo_visitors" data-flag-title="操作系统学习笔记-I/O管理和磁盘调度" title="阅读次数">
      <span class="post-meta-item-icon">
        <i class="far fa-eye"></i>
      </span>
      <span class="post-meta-item-text">阅读次数：</span>
      <span id="twikoo_visitors"></span>
    </span>
  
      </div>
      <div class="post-meta">
    <span class="post-meta-item" title="本文字数">
      <span class="post-meta-item-icon">
        <i class="far fa-file-word"></i>
      </span>
      <span class="post-meta-item-text">本文字数：</span>
      <span>6.8k</span>
    </span>
    <span class="post-meta-item" title="阅读时长">
      <span class="post-meta-item-icon">
        <i class="far fa-clock"></i>
      </span>
      <span class="post-meta-item-text">阅读时长 &asymp;</span>
      <span>6 分钟</span>
    </span>
</div>

            <div class="post-description">记录操作系统学习历程</div>
        </div>
      </header>

    
    
    
    <div class="post-body" itemprop="articleBody">
        <h1 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h1><p><em>正在学习操作系统，记录笔记。</em></p>
<blockquote>
<p>参考资料：</p>
<p>《操作系统（精髓与设计原理 第8版） 》</p>
</blockquote>
<hr>
<h1 id="第十一章：I-O管理和磁盘调度"><a href="#第十一章：I-O管理和磁盘调度" class="headerlink" title="第十一章：I/O管理和磁盘调度"></a>第十一章：I/O管理和磁盘调度</h1><h2 id="I-O设备"><a href="#I-O设备" class="headerlink" title="I/O设备"></a>I/O设备</h2><p>I/O设备大体上可以分为如下三类：</p>
<ul>
<li>人可读：顾名思义就是其面向的用户群体是人，具体有：<ul>
<li>打印机</li>
<li>终端（包含：显示器、键盘、鼠标等）</li>
</ul>
</li>
<li>机器可读：面向电子设备通信，具体有：<ul>
<li>磁盘、磁带驱动器</li>
<li>传感器</li>
<li>控制器</li>
</ul>
</li>
<li>通信：适用于与远程设备通信，如：<ul>
<li>数字线路驱动器</li>
<li>调制解调器</li>
</ul>
</li>
</ul>
<p>数据传送速率：不同类型的I/O设备，数据传送速率可能会相差几个数量级，如下图：</p>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/OS%E4%B8%8D%E5%90%8CIO%E8%AE%BE%E5%A4%87%E7%9A%84%E9%80%9F%E7%8E%87.png"></p>
<p>用途：设备用途对操作系统及其支撑设施中的软件和策略都有影响。</p>
<ul>
<li>用于存储文件的磁盘需要文件管理软件的支持</li>
<li>虚拟内存需要特殊硬件软件支持</li>
<li>终端既可被普通用户使用，也可被系统管理员使用。</li>
</ul>
<p>控制的复杂性：例如，打印机仅需要一个相对简单的控制接口，而磁盘的控制接口则要复杂得多。</p>
<p>传送单位：数据可按字节流或字符流的形式传送（如终端I/O），也可按更大的块传送（如磁盘I/O）。</p>
<p>错误条件：随着设备的不同，错误的性质、报告错误的方式、错误造成的后果及有效的响应范围，都各不相同。</p>
<blockquote>
<p>以上的差异使得不管是从操作系统的角度，还是从用户进程的角度，都很难找到一种统一的、一致的I/O解决方法。</p>
</blockquote>
<h2 id="I-O功能的组织"><a href="#I-O功能的组织" class="headerlink" title="I/O功能的组织"></a>I/O功能的组织</h2><p>有三种执行I/O的技术（具体可以看<a href="https://cnhuazhu.gitee.io/2021/03/14/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0-%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%B3%BB%E7%BB%9F%E6%A6%82%E8%BF%B0/">第一章</a>的内容，这里不过多介绍）：</p>
<ul>
<li><p>可编程I/O：处理器代表一个进程给I/O模块发送一个I/O命令；该进程进入忙等待，直到操作完成才能继续执行。</p>
<blockquote>
<p>缺点：当执行I/O操作时，处理器容易进入忙等待状态（空闲），造成处理器资源浪费。</p>
</blockquote>
</li>
<li><p>中断驱动I/O：处理器代表进程向I/O模块发出一个I/O命令。有两种可能性：</p>
<ul>
<li><p>若来自进程的I/O指令是非阻塞的，则处理器继续执行发出I/O命令的进程的后续指令。</p>
</li>
<li><p>若I/O指令是阻塞的，则处理器执行的下一条指令来自操作系统，它将当前的进程设置为阻塞态并调度其他进程。</p>
<blockquote>
<p>引入中断机制。</p>
<p>缺点：虽然缓解了忙等待状况，但是最后数据在I/O设备与主存之间传输的过程要依赖于处理器。</p>
</blockquote>
</li>
</ul>
</li>
<li><p>直接存储器访问（Direct Memory Access，DMA）：一个DMA模块（作为“代理CPU”）控制内存和I/O模块之间的数据交换。为传送一块数据，处理器给DMA模块发请求，且只有在整个数据块传送结束后，它才被中断。</p>
<blockquote>
<p>数据在I/O设备与主存之间传输的整个过程只产生两次中断：</p>
<ul>
<li>在调用I/O设备前，处理器向I/O设备发出指令</li>
<li>数据传输完之后，DMA模块向I/O设备发出中断（告知“数据传输完毕”）</li>
</ul>
<p>优势：数据在I/O设备与主存之间传输不依赖于处理器。</p>
</blockquote>
</li>
</ul>
<p>小结I/O执行技术</p>
<table>
<thead>
<tr>
<th></th>
<th>无中断</th>
<th>使用中断</th>
</tr>
</thead>
<tbody><tr>
<td>通过处理器实现I/O和内存间的传送</td>
<td>可编程I/O</td>
<td>中断驱动I/O</td>
</tr>
<tr>
<td>I/O和内存间直接传送</td>
<td></td>
<td>直接存储器访问（DMA）</td>
</tr>
</tbody></table>
<h3 id="I-O功能的发展"><a href="#I-O功能的发展" class="headerlink" title="I/O功能的发展"></a>I/O功能的发展</h3><ol>
<li><p>处理器直接控制外围设备：这在简单的微处理器控制设备中可以见到。</p>
</li>
<li><p>增加了控制器或I/O模块：引入无中断的可编程I/O。</p>
<blockquote>
<p>从该阶段开始，处理器无需处理外部设备的细节。</p>
</blockquote>
</li>
<li><p>同上一阶段基本相同，但是采用了中断的方式：处理器无须费时间等待执行一次I/O操作，因而提高了效率。</p>
</li>
<li><p>DMA模块的引入：数据块在I/O设备和内存中移动无需处理器参与，仅在传送开始和结束时才需要用到处理器。</p>
</li>
<li><p>I/O模块有一个独立处理器：有专门为I/O设计的指令集，中央处理器指导I/O处理器执行内存中的一个I/O程序。I/O处理器在没有中央处理器干涉的情况下取指令并执行这些指令。这就使得中央处理器可以指定一系列的I/O活动，且仅在整个序列执行完成后中央处理器才被中断。</p>
<blockquote>
<p>该阶段的I/O模块通常称为：I/O channel (I/O通道)</p>
</blockquote>
</li>
<li><p>I/O模块有自己的局部存储器，事实上其本身就是一台计算机：</p>
<ul>
<li>使用这种体系结构可以控制许多I/O设备，并使需要中央处理器参与的部分降到最小</li>
<li>这种结构通常用于控制与交互终端的通信，I/O处理器负责大多数控制终端的任务</li>
</ul>
<blockquote>
<p>该阶段的I/O模块通常称为：I/O processor (I/O处理器)</p>
</blockquote>
</li>
</ol>
<h3 id="直接存储器访问（DMA）"><a href="#直接存储器访问（DMA）" class="headerlink" title="直接存储器访问（DMA）"></a>直接存储器访问（DMA）</h3><p>下图是典型的DMA框图</p>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/OSDMA%E6%A1%86%E5%9B%BE.png"></p>
<blockquote>
<p>说明：</p>
<ul>
<li>Data Count：保存此次传输的数据的字节数</li>
<li>Data Register：存放正在传输的数据</li>
<li>Address Register：基址寄存器</li>
<li>Control Logic：其他的一些功能</li>
</ul>
<p>DMA工作流程：</p>
<ol>
<li>处理器和DMA模块之间有读写控制线，基于此处理器可以向DMA模块发送命令（请求I/O）</li>
<li>DMA模块直接负责I/O设备到内存之间的数据传输（不需要处理器）</li>
<li>在数据传输完之后，DMA模块向处理器发送一个中断信号</li>
</ol>
</blockquote>
<p>DMA机制的配置：</p>
<ul>
<li><p>所有模块共享同一个系统总线：</p>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/OSDMA%E6%9C%BA%E5%88%B6%E4%B8%80.png"></p>
<ul>
<li>DMA模块充当代理处理器</li>
<li>同一时刻只允许一个I/O设备和主存进行交互，否则会出现数据冲突</li>
<li>同一个时间段可以有多台I/O设备和主存进行交互——分时复用</li>
<li>排队的情况很严重，虽然这样的设计开销不大，但是效率很低</li>
</ul>
</li>
<li><p>集成DMA和I/O：</p>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/OSDMA%E6%9C%BA%E5%88%B6%E4%BA%8C.png"></p>
<ul>
<li><p>减少了I/O对DMA模块的竞争</p>
<blockquote>
<p>在DMA模块和一个或多个I/O模块之间还存在一条不包含系统总线的路径。DMA逻辑实际上可能就是I/O模块的一部分，或可能是控制一个或多个I/0模块的一个单独模块。</p>
</blockquote>
</li>
</ul>
</li>
<li><p>增加I/O局部总线：</p>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/OSDMA%E6%9C%BA%E5%88%B6%E4%B8%89.png"></p>
<ul>
<li>DMA模块中I/O接口的数量减少到1</li>
<li>易扩展</li>
</ul>
<blockquote>
<p>第二、三种方式：DMA和I/O模块之间的数据交换是脱离系统总线完成的。</p>
</blockquote>
</li>
</ul>
<h2 id="操作系统设计问题"><a href="#操作系统设计问题" class="headerlink" title="操作系统设计问题"></a>操作系统设计问题</h2><h3 id="设计目标"><a href="#设计目标" class="headerlink" title="设计目标"></a>设计目标</h3><p>在设计I/O机制时，最重要的两个目标就是：效率（Efficiency）、通用性（Generality）。</p>
<ul>
<li><p>效率：</p>
<ul>
<li><p>I/O操作通常是计算机系统的瓶颈。</p>
<blockquote>
<p>之前也提到过，大多数I/O设备都是机械运动，而处理器是电信号的处理，二者的速度差距在几个数量级。</p>
</blockquote>
</li>
<li><p>解决上述问题的一种方式是引入多道程序设计。这样可以缓解，但不能彻底解决问题。我们想象一种极端情况：在并发度达到最大时，所有的进程都在等待I/O设备，那么这时也会出现CPU空闲状态，效率并不能有效提高。</p>
</li>
<li><p>于是引入交换技术。用于将额外的就绪进程加载进内存，从而使处理器处于工作状态。（这本身就是一个I/O操作）</p>
</li>
</ul>
</li>
<li><p>通用性：处于简单和避免错误的考虑，希望能用一种统一的方式处理所有设备。</p>
<blockquote>
<p>注：有些版本将“通用性”翻译为“设备的独立性”。</p>
</blockquote>
<ul>
<li><p>处理器看待I/O设备的方式统一。</p>
</li>
<li><p>操作系统管理I/O设备和IVO操作的方式统一。</p>
<blockquote>
<p>由于设备特性的多样性，在实际中很难真正实现通用性。</p>
<p>目前所能做的就是用一种层次化、模块化的方法设计I/O功能。这种方法隐藏了大部分I/O设备低层例程中的细节，使得用户进程和操作系统高层可以通过如读、写、打开、关闭、加锁和解锁等通用的函数来操作I/O设备。</p>
</blockquote>
</li>
</ul>
</li>
</ul>
<h3 id="I-O功能的逻辑结构"><a href="#I-O功能的逻辑结构" class="headerlink" title="I/O功能的逻辑结构"></a>I/O功能的逻辑结构</h3><p>分层的原理是：操作系统的功能可以根据其复杂性、特征时间尺度和抽象层次来分开。</p>
<p>将分层原理应用于I/O机制，具体如下图：</p>
<h3 id=""><a href="#" class="headerlink" title=""></a><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/OSIO层次结构.png" style="zoom:80%;" /></h3><blockquote>
<p>说明：</p>
<ul>
<li>逻辑I/O（Logical I/O）：逻辑I/O模块把设备当作一个逻辑资源来处理，它并不关心实际控制设备的细节。</li>
<li>设备I/O（Device I/O）：请求的操作和数据（缓冲的数据、记录等）被转换为适当的I/O指令序列、通道命令和控制器命令。</li>
<li>调度和控制（Scheduling &amp; control）：I/O操作的排队、调度实际上发生在这一层。</li>
<li>目录管理（Directory management）：在这一层，符号文件被转换为标识符，采用标识符时可通过文件描述符表或索引表直接或间接地访问文件。</li>
<li>文件系统（File system）：这一层处理文件的逻辑结构及用户指定的操作，如打开、关闭、读、写等。这一层还管理访问权限。</li>
<li>物理组织（Physical organization）：考虑到辅存设备的物理磁道和扇区结构，对于文件和记录的逻辑访问必须转换为物理外存地址。辅助存储空间和内存缓冲区的分配通常也在这一层处理。</li>
</ul>
</blockquote>
<h2 id="I-O缓冲"><a href="#I-O缓冲" class="headerlink" title="I/O缓冲"></a>I/O缓冲</h2><p>缓存（buffering）的原因：</p>
<ul>
<li>处理器在I/O完成之前必须等待</li>
<li>在页交换的过程中，某些页必须驻留内存</li>
</ul>
<blockquote>
<p>缓存（buffer）：内存当中预留的一个区域，用来暂存I/O通讯的数据。</p>
<p>举例：</p>
<ul>
<li>printf函数：可能有时候会出现明明在程序中写了printf，但是并没有如期望般那样得到输出结果。这是因为printf是一个带缓冲的输出打印。printf本身会调用一个系统调用，会产生进程切换，如果仅为了打印一句“Hello World”就使用进程切换，可以认为这是没必要的。所以会当缓冲区满了的时候再一次性打印出来。（如果必要，我们也可以用fflush去强制清除缓存，将其打印出来）</li>
<li>打印机：在使用打印机的时候可以看到计算机屏幕上显示进度条（完成一页、两页….），待到进度条完成之后，打印机才开始工作。进度条展示的其实就是将数据存储到缓冲区的进度，当执行完成后，处理器就可以完成其他的任务去了，接下来才是打印机去访问缓冲区，将数据真实地打印出来。</li>
</ul>
<p>优点：</p>
<ul>
<li>可以让CPU和I/O并行操作</li>
<li>减少中断次数</li>
<li>提高CPU效率</li>
</ul>
</blockquote>
<p>缓冲的定义：在输入请求发出前就开始执行输入传送，并且在输出请求发出一段时间之后才开始执行输出传送。</p>
<blockquote>
<p>光看定义可能有些不知所云，往下看，慢慢体会。</p>
</blockquote>
<p>在讨论各种缓冲方法之前，首先要区分两类I/O设备：</p>
<ul>
<li>面向块（Block-oriented）的I/O设备：<ul>
<li>将信息保存到固定大小的块中</li>
<li>传送过程中一次传输一块</li>
<li>通常可以通过块号访问数据</li>
<li>举例：磁盘、磁带、USB智能卡</li>
</ul>
</li>
<li>面向流（Stream-oriented）的I/O设备：<ul>
<li>以字节流的方式输入\输出数据</li>
<li>举例：终端、打印机、通信端口、鼠标和其他指示设备及其他大多数非辅存设备</li>
</ul>
</li>
</ul>
<h3 id="单缓冲"><a href="#单缓冲" class="headerlink" title="单缓冲"></a>单缓冲</h3><p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/OS%E5%8D%95%E7%BC%93%E5%86%B2.png"></p>
<ul>
<li>I/O设备先将传送的数据移入到系统缓冲区中（I/O → 内存）</li>
<li>上一步传输完成时，进程把该块移动到用户空间（内存 → 内存）</li>
<li>紧接着，根据局部性原理，会预先请求另一个数据块，将其移入缓冲区（预读；或预先输入）</li>
</ul>
<p>优点：</p>
<ul>
<li>用户进程可在下一数据块读取的同时，处理已读入的数据块</li>
<li>输入发生在系统内存而非用户进程内存，因此操作系统可以将该进程换出</li>
</ul>
<p>缺点：</p>
<ul>
<li><p>操作系统必须记录给用户进程分配系统缓冲区的情况</p>
<blockquote>
<p>操作系统维护用户进程系统缓冲区。</p>
</blockquote>
</li>
<li><p>交换逻辑也受到影响</p>
<blockquote>
<p>I/O操作所涉及的磁盘和用于交换的磁盘是同一个磁盘时，磁盘写操作排队等待将进程换出到同一个设备上是没有任何意义的。若试图换出进程并释放内存，则要在I/O操作完成后才能开始，而在这时，把进程换出到磁盘已经不再合适。</p>
</blockquote>
</li>
</ul>
<p>面向流的单缓冲：</p>
<ul>
<li>每次传送一行的方式或每次传送一字节的方式</li>
<li>用户在终端每次输入一行，用回车表示到达行尾</li>
<li>输出到终端时也是类似地每次输出一行</li>
</ul>
<h3 id="双缓冲"><a href="#双缓冲" class="headerlink" title="双缓冲"></a>双缓冲</h3><p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/OS%E5%8F%8C%E7%BC%93%E5%86%B2.png"></p>
<ul>
<li><p>在内存中为操作系统分配两个系统缓冲区</p>
</li>
<li><p>输入输出交替使用</p>
<blockquote>
<p>在一个进程向一个缓冲区中传送数据（从这个缓冲区中取数据）的同时，操作系统正在清空（或填充）另一个缓冲区，这种技术称为双缓冲（double buffering）或缓冲交换（buffer swapping）。</p>
</blockquote>
</li>
</ul>
<h3 id="循环缓冲"><a href="#循环缓冲" class="headerlink" title="循环缓冲"></a>循环缓冲</h3><p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/OS%E5%BE%AA%E7%8E%AF%E7%BC%93%E5%86%B2.png"></p>
<ul>
<li>内存中有两个以上的缓冲区</li>
<li>每个单缓冲区是循环缓冲器的一个单元</li>
<li>平滑I/O操作和进程之间的数据流</li>
</ul>
<h2 id="磁盘调度"><a href="#磁盘调度" class="headerlink" title="磁盘调度"></a>磁盘调度</h2><h3 id="磁盘性能"><a href="#磁盘性能" class="headerlink" title="磁盘性能"></a>磁盘性能</h3><p>磁盘的内部结构如下图：</p>
<img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/OS磁盘模型1.png" style="zoom: 50%;" />

<blockquote>
<p>说明：为了读或写，磁头必须定位于指定的磁道和该磁道中指定扇区的开始处。</p>
</blockquote>
<p>磁盘性能参数：</p>
<ul>
<li>寻道时间（Seek time ）：磁头定位到磁道所需要的时间称为寻道时间。</li>
<li>旋转延迟（Rotational delay ）：磁头到达扇区开始位置的时间称为旋转延迟。</li>
<li>传输时间（transfer time）：磁头定位完成就开始读操作或写操作，这就是数据传输，传输的时间就是传输时间。</li>
</ul>
<p><strong>磁盘调度（重点）</strong>：</p>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/OS%E7%A3%81%E7%9B%98%E7%9A%84%E6%80%A7%E8%83%BD.png"></p>
<p>上图为磁盘I/O传送的一般时序图：</p>
<p><strong>等待I/O设备 → 等待通道 → 寻道（确定磁道） → 旋转延迟（确定扇区） → 数据传输延迟</strong></p>
<blockquote>
<p>相关计算：</p>
<p>传输时间：<br>$$<br>T = \frac{b}{rN}<br>$$</p>
<ul>
<li>T：传输时间</li>
<li>b：要传送的字节数</li>
<li>N：一个磁道中的字节数</li>
<li>r：旋转速度（单位：转/秒）</li>
</ul>
<p>总平均存取时间：<br>$$<br>T_a = T_s + \frac{1}{2r} +\frac{b}{rN}<br>$$</p>
<ul>
<li>T<sub>s</sub>：平均寻道时间</li>
</ul>
</blockquote>
<h3 id="磁盘调度策略"><a href="#磁盘调度策略" class="headerlink" title="磁盘调度策略"></a>磁盘调度策略</h3><p>不同磁盘调度的性能差异的原因可以追溯到寻道时间。因此为了提高性能，需要减少花费在寻道上的时间。</p>
<p>考虑多道程序环境中的一种典型情况：即操作系统为每个I/O设备维护一个请求队列。</p>
<ul>
<li>对于一个磁盘来说，队列中可能有来自多个进程的许多I/O请求（读和写）</li>
<li>随机调度（random scheduling）：随机访问磁道。该种方法性能最差，可用于评估其他技术。</li>
</ul>
<p>下面我们将会介绍八种磁盘调度策略，在介绍时会统一以一个例子进行：</p>
<blockquote>
<p>例子：</p>
<p>假设磁盘有200个磁道，磁盘请求队列中是一些随机请求。被请求的磁道，按照磁盘调度程序的接收顺序分别为：</p>
<p><strong>55、58、39、18、90、160、150、38、184</strong></p>
<p>说明：</p>
<p>假设以磁道号为100处开始寻道。</p>
<p>具体以折线图的形式展示：纵轴表示磁盘上的磁道；横轴表示时间（或跨越磁道的数量）。</p>
</blockquote>
<h4 id="优先级（Priority，PRI）"><a href="#优先级（Priority，PRI）" class="headerlink" title="优先级（Priority，PRI）"></a>优先级（Priority，PRI）</h4><ul>
<li>此方法不会优化磁盘的利用率</li>
<li>通常较短的批作业和交互作业的优先级较高</li>
<li>可以提供较好的交互响应时间</li>
</ul>
<h4 id="先进先出（First-in-First-out，FIFO）"><a href="#先进先出（First-in-First-out，FIFO）" class="headerlink" title="先进先出（First-in First-out，FIFO）"></a>先进先出（First-in First-out，FIFO）</h4><p>处理请求的顺序（如下图）：<code>55、58、39、18、90、160、150、38、184</code></p>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/OS%E7%A3%81%E7%9B%98%E8%B0%83%E5%BA%A6%E5%85%88%E8%BF%9B%E5%85%88%E5%87%BA.png"></p>
<ul>
<li>这是最简单的调度策略</li>
<li>按照收到请求的顺序进行处理</li>
<li>优点：公平对待每个请求</li>
<li>缺点：并未对磁头的访问有任何优化，效率最差。在多进程环境中，性能接近随机调度。</li>
</ul>
<h4 id="后进先出（Last-in-First-out，LIFO）"><a href="#后进先出（Last-in-First-out，LIFO）" class="headerlink" title="后进先出（Last-in First-out，LIFO）"></a>后进先出（Last-in First-out，LIFO）</h4><p>处理请求的顺序：<code>184、38、150、160、90、18、39、58、55</code></p>
<ul>
<li><p>考虑到了局部性原理</p>
<blockquote>
<p>在事物处理系统中，由于顺序读取文件的缘故，把设备分配给最后到来的用户，可减少磁臂的运动，甚至没有磁臂运动。</p>
</blockquote>
</li>
<li><p>缺点：可能会产生饥饿</p>
<blockquote>
<p>假设队列中不停地有新的请求，那么最先进入队列的请求很可能饥饿。</p>
</blockquote>
</li>
</ul>
<h4 id="最短服务时间优先（Shortest-Service-Time-First-，SSTF）"><a href="#最短服务时间优先（Shortest-Service-Time-First-，SSTF）" class="headerlink" title="最短服务时间优先（Shortest Service Time First ，SSTF）"></a>最短服务时间优先（Shortest Service Time First ，SSTF）</h4><p>处理请求的顺序（如下图）：<code>90、58、55、39、38、18、150、160、184</code></p>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/OS%E7%A3%81%E7%9B%98%E8%B0%83%E5%BA%A6%E6%9C%80%E7%9F%AD%E6%9C%8D%E5%8A%A1%E6%97%B6%E9%97%B4%E4%BC%98%E5%85%88.png"></p>
<ul>
<li><p>策略：选择使磁头臂从当前位置开始移动最少的磁盘I/O请求（如果两个距离相等，随机选择方向）</p>
</li>
<li><p>总是选择最小寻道时间的请求</p>
<blockquote>
<p>考虑的指标太单一，并不能保证平均寻道时间最小</p>
</blockquote>
</li>
<li><p>可能会产生饥饿</p>
<blockquote>
<p>如果不停有新的请求，该请求距离磁头很近，那么距离磁头较远的请求可能饥饿。</p>
</blockquote>
</li>
</ul>
<h4 id="SCAN（扫描，电梯算法）"><a href="#SCAN（扫描，电梯算法）" class="headerlink" title="SCAN（扫描，电梯算法）"></a>SCAN（扫描，电梯算法）</h4><p>处理请求的顺序（如下图）：<code>55、58、39、18、90、160、150、38、184</code></p>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/OSSCAN.png"></p>
<ul>
<li><p>策略：磁头臂仅沿一个方向移动，并在途中满足所有未完成的请求，直到它达到这个方向上的最后一个磁道，或者在这个方向上没有其他请求为止，反转扫描方向。</p>
<p>考虑了局部性原理</p>
<blockquote>
<p>这种定向移动的形式类似于电梯，因此也被称为“电梯算法”。</p>
</blockquote>
</li>
<li><p>可以解决饥饿</p>
</li>
<li><p>问题：基于该例假设，假设在处理完184号磁道请求之后，磁头反向扫描，这时又有新的185号磁道访问请求，那么磁头会扫描一轮之后再回来处理，显然是不合理的。</p>
</li>
</ul>
<h4 id="C-SCAN（循环扫描）"><a href="#C-SCAN（循环扫描）" class="headerlink" title="C-SCAN（循环扫描）"></a>C-SCAN（循环扫描）</h4><p>处理请求的顺序（如下图）：<code>55、58、39、18、90、160、150、38、184</code></p>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/OSCSCAN.png"></p>
<ul>
<li>策略：将扫描方向固定。当访问到沿某个方向的最后一个磁道时，磁头臂返回到磁道相反方向末端的磁道。</li>
<li>可以解决SCAN的问题。减少了新请求的最大延迟。</li>
</ul>
<h4 id="N-step-SCAN"><a href="#N-step-SCAN" class="headerlink" title="N-step-SCAN"></a>N-step-SCAN</h4><ul>
<li>将磁盘请求队列划分为长度为N的n个子队列</li>
<li>对于n个子队列采取FIFO算法</li>
<li>对于子队列中的N个请求，采取SCAN算法</li>
<li>如果有新的请求，将其添加到新的队列中去</li>
</ul>
<h4 id="FSCAN"><a href="#FSCAN" class="headerlink" title="FSCAN"></a>FSCAN</h4><ul>
<li>使用两个子队列</li>
<li>扫描开始时，所有请求都在一个队列中，另一个队列为空。</li>
<li>在扫描过程中，所有新到的请求都放入另一个队列。</li>
</ul>
<h4 id="磁盘调度算法比较"><a href="#磁盘调度算法比较" class="headerlink" title="磁盘调度算法比较"></a>磁盘调度算法比较</h4><p>比较FIFO、SSTF、SCANF、C-SCAN算法，如下图：</p>
<p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/OS%E7%A3%81%E7%9B%98%E8%B0%83%E5%BA%A6%E6%AF%94%E8%BE%83.png"></p>
<blockquote>
<p>注意：计算平均寻道时间时，注意分母的取值。</p>
<p>以FIFO为例</p>
<ul>
<li>从磁道100处开始：</li>
</ul>
<p>$$<br>AVE = \frac{45+3+19+21+72+70+10+112+146}{9} = 55.3<br>$$</p>
<ul>
<li>从磁道55处开始：<br>$$<br>AVE = \frac{0+3+19+21+72+70+10+112+146}{9-1} = 56.625<br>$$</li>
</ul>
<p><strong>注意磁头开始的位置</strong></p>
</blockquote>
<h2 id="RAID"><a href="#RAID" class="headerlink" title="RAID"></a>RAID</h2><p>受限于技术，磁盘存储器的大小并不能无限扩大，虽然技术在不断进步，其大小也在逐渐增大，但要意识到一个问题，现实中我们对于磁盘存储的需求可能要远远大于其实际容量。</p>
<p>设计人员认识到这个问题，并提出了并行使用多个磁盘的方案。</p>
<p>独立磁盘冗余阵列（Redundant Array of Independent Disks，RAID）：</p>
<ul>
<li>物理上通过多个磁盘组成一个磁盘组，在逻辑上这是一个大容量的磁盘</li>
<li>使用冗余磁盘容量保存奇偶检验信息，保证在一个磁盘失效时，数据具有可恢复性</li>
</ul>
<p>RAID包含0~6共七个级别，这里仅介绍RAID0、RAID1、RAID5</p>
<h4 id="RAID0"><a href="#RAID0" class="headerlink" title="RAID0"></a>RAID0</h4><p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/OSRAID0.png"></p>
<ul>
<li>实现高数据传送能力</li>
<li>实现告诉I/O请求率</li>
</ul>
<h4 id="RAID1"><a href="#RAID1" class="headerlink" title="RAID1"></a>RAID1</h4><p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/OSRAID1.png"></p>
<ul>
<li>读请求可由包含被请求数据的任何一个磁盘提供服务，而不管哪个磁盘拥有最小寻道时间和旋转延迟。</li>
<li>写请求需要对两个响应的条带进行更新，但这可并行完成。</li>
<li>从失效中恢复很简单：当一个驱动器失效时，仍然可以从第二个驱动器访问到数据。</li>
</ul>
<h4 id="RAID5"><a href="#RAID5" class="headerlink" title="RAID5"></a>RAID5</h4><p><img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/OSRAID5.png"></p>
<ul>
<li>把奇偶校验条带分布在所有磁盘中。</li>
</ul>
<hr>
<h1 id="后记"><a href="#后记" class="headerlink" title="后记"></a>后记</h1><p>本篇已完结</p>
<p>（如有修改或补充欢迎评论）</p>

    </div>

    
    
    
      
  <div class="popular-posts-header">相关文章</div>
  <ul class="popular-posts">
    <li class="popular-posts-item">
      <div class="popular-posts-title"><a href="\next\2021\03\28\操作系统\操作系统学习笔记\" rel="bookmark">操作系统学习笔记</a></div>
    </li>
    <li class="popular-posts-item">
      <div class="popular-posts-title"><a href="\next\2021\06\09\操作系统\操作系统学习笔记-文件管理\" rel="bookmark">操作系统学习笔记-文件管理</a></div>
    </li>
    <li class="popular-posts-item">
      <div class="popular-posts-title"><a href="\next\2021\05\30\操作系统\操作系统学习笔记-单处理器调度\" rel="bookmark">操作系统学习笔记-单处理器调度</a></div>
    </li>
    <li class="popular-posts-item">
      <div class="popular-posts-title"><a href="\next\2021\05\24\操作系统\操作系统学习笔记-虚拟内存\" rel="bookmark">操作系统学习笔记-虚拟内存</a></div>
    </li>
    <li class="popular-posts-item">
      <div class="popular-posts-title"><a href="\next\2021\05\23\操作系统\操作系统学习笔记-内存管理\" rel="bookmark">操作系统学习笔记-内存管理</a></div>
    </li>
  </ul>


    <footer class="post-footer">
          <div class="reward-container">
  <div></div>
  <button>
    赞赏
  </button>
  <div class="post-reward">
      <div>
        <img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/wechat.png" alt="花猪 微信">
        <span>微信</span>
      </div>
      <div>
        <img src="https://cdn.jsdelivr.net/gh/CNhuazhu/Image/alipay.jpg" alt="花猪 支付宝">
        <span>支付宝</span>
      </div>

  </div>
</div>

          <div class="post-tags">
              <a href="/next/tags/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/" rel="tag"><i class="fa fa-tag"></i> 操作系统</a>
          </div>

        

          <div class="post-nav">
            <div class="post-nav-item">
                <a href="/next/2021/05/30/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0-%E5%8D%95%E5%A4%84%E7%90%86%E5%99%A8%E8%B0%83%E5%BA%A6/" rel="prev" title="操作系统学习笔记-单处理器调度">
                  <i class="fa fa-chevron-left"></i> 操作系统学习笔记-单处理器调度
                </a>
            </div>
            <div class="post-nav-item">
                <a href="/next/2021/06/07/Flask/Flask%E5%88%A9%E7%94%A8ajax%E5%AE%9E%E7%8E%B0%E5%89%8D%E7%AB%AF%E5%88%B0%E5%90%8E%E7%AB%AF%E7%9A%84%E6%95%B0%E6%8D%AE%E4%BC%A0%E8%BE%93/" rel="next" title="Flask利用ajax实现前端到后端的数据传输">
                  Flask利用ajax实现前端到后端的数据传输 <i class="fa fa-chevron-right"></i>
                </a>
            </div>
          </div>
    </footer>
  </article>
</div>






    <div class="comments"><div id="twikoo-comments"></div></div>
</div>
  </main>

  <footer class="footer">
    <div class="footer-inner">


<div class="copyright">
  &copy; 
  <span itemprop="copyrightYear">2021</span>
  <span class="with-love">
    <i class="fa fa-heart"></i>
  </span>
  <span class="author" itemprop="copyrightHolder">花猪</span>
</div>
<div class="wordcount">
  <span class="post-meta-item">
    <span class="post-meta-item-icon">
      <i class="fa fa-chart-line"></i>
    </span>
      <span>站点总字数：</span>
    <span title="站点总字数">356k</span>
  </span>
  <span class="post-meta-item">
    <span class="post-meta-item-icon">
      <i class="fa fa-coffee"></i>
    </span>
      <span>站点阅读时长 &asymp;</span>
    <span title="站点阅读时长">5:23</span>
  </span>
</div>
  <div class="powered-by">由 <a href="https://hexo.io/" rel="noopener" target="_blank">Hexo</a> & <a href="https://theme-next.js.org/mist/" rel="noopener" target="_blank">NexT.Mist</a> 强力驱动
  </div>

    </div>
  </footer>

  
  <script src="https://cdn.jsdelivr.net/npm/animejs@3.2.1/lib/anime.min.js" integrity="sha256-XL2inqUJaslATFnHdJOi9GfQ60on8Wx1C2H8DYiN1xY=" crossorigin="anonymous"></script>
  <script src="https://cdn.jsdelivr.net/npm/@next-theme/pjax@0.5.0/pjax.min.js" integrity="sha256-3NkoLDrmHLTYj7csHIZSr0MHAFTXth7Ua/DDt4MRUAg=" crossorigin="anonymous"></script>
  <script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js" integrity="sha256-/xUj+3OJU5yExlq6GSYGSHk7tPXikynS7ogEvDej/m4=" crossorigin="anonymous"></script>
  <script src="https://cdn.jsdelivr.net/npm/@fancyapps/fancybox@3.5.7/dist/jquery.fancybox.min.js" integrity="sha256-yt2kYMy0w8AbtF89WXb2P1rfjcP/HTHLT7097U8Y5b8=" crossorigin="anonymous"></script>
  <script src="https://cdn.jsdelivr.net/npm/medium-zoom@1.0.6/dist/medium-zoom.min.js" integrity="sha256-EdPgYcPk/IIrw7FYeuJQexva49pVRZNmt3LculEr7zM=" crossorigin="anonymous"></script>
<script src="/next/js/comments.js"></script><script src="/next/js/utils.js"></script><script src="/next/js/motion.js"></script><script src="/next/js/schemes/muse.js"></script><script src="/next/js/next-boot.js"></script><script src="/next/js/pjax.js"></script>

  
<script src="/next/js/third-party/search/local-search.js"></script>




  


  <script class="next-config" data-name="leancloud_visitors" type="application/json">{"enable":true,"app_id":"dh8GVAcIwU1TN4zhA5y63iW1-gzGzoHsz","app_key":"hzyAqDKjG4OBGrdPS7mKaOa7","server_url":null,"security":true}</script>
  <script src="/next/js/third-party/statistics/lean-analytics.js"></script>


  

  <script class="next-config" data-name="enableMath" type="application/json">true</script><script class="next-config" data-name="mathjax" type="application/json">{"enable":true,"tags":"none","js":{"url":"https://cdn.jsdelivr.net/npm/mathjax@3.2.0/es5/tex-mml-chtml.js","integrity":"sha256-r+3itOMtGGjap0x+10hu6jW/gZCzxHsoKrOd7gyRSGY="}}</script>
<script src="/next/js/third-party/math/mathjax.js"></script>


<script class="next-config" data-name="twikoo" type="application/json">{"enable":true,"visitor":true,"envId":"hexo-1g41404w9f800e94","el":"#twikoo-comments"}</script>
<script>
document.addEventListener('page:loaded', () => {
  NexT.utils.loadComments(CONFIG.twikoo.el)
    .then(() => NexT.utils.getScript(
      'https://cdn.jsdelivr.net/npm/twikoo/dist/twikoo.all.min.js',
      { condition: window.twikoo }
    ))
    .then(() => {
      twikoo.init(CONFIG.twikoo);
    });
});
</script>

</body>
</html>
